home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CD ROM Paradise Collection 4
/
CD ROM Paradise Collection 4 1995 Nov.iso
/
program
/
svgakt50.zip
/
SRC
/
SVGAKIT
/
TEST.ASM
< prev
next >
Wrap
Assembly Source File
|
1994-08-23
|
6KB
|
198 lines
;****************************************************************************
;*
;* The SuperVGA Kit
;*
;* Copyright (C) 1994 SciTech Software
;* All rights reserved.
;*
;* Filename: $RCSfile: test.asm $
;* Version: $Revision: 1.1 $
;*
;* Language: 80386 Assembler
;* Environment: IBM PC Real Mode and 16/32 bit Protected Mode.
;*
;* Description: Assembly language test routines for the SuperVGA Kit
;* SVGATEST.EXE and PROFILE.EXE programs. These routines have
;* been moved to this module as they are not part of the
;* SuperVGA Kit proper as such.
;*
;* $Id: test.asm 1.1 1994/08/22 12:27:12 kjb release $
;*
;****************************************************************************
IDEAL
INCLUDE "model.mac" ; Memory model macros
header test ; Set up memory model
CRTC EQU 3D4h ; Port of CRTC registers
$EXTRN _maxx,UINT
$EXTRN _maxy,UINT
$EXTRN _maxcolor,ULONG
$EXTRN _maxpage,UINT
$EXTRN _bytesperline,USHORT
$EXTRN _pagesize,ULONG
$EXTRN _curBank,UINT
EXTRN setBank:FPTR
EXTRN setReadBank:FPTR
begcodeseg test
;----------------------------------------------------------------------------
; void _copyTest16(void)
;----------------------------------------------------------------------------
; Routine to copy the top half of video memory to the bottom half of
; video memory. To ensure that we a moving across a bank boundary in
; 16 color modes, we copy the data to the second video page.
;----------------------------------------------------------------------------
procstart __copyTest16
enter_c 0
push ds ; Save registers
mov _ax,[_maxy]
inc ax
shr ax,1 ; AX := (Yres+1) / 2
mul [_bytesperline]
mov cx,ax ; CX := Number of bytes to move
; Set up graphics controller
mov dx,3CEh ; DX := Graphics Controller address port
mov ax,0105h ; AH := 1 (read mode 0, write mode 1)
; AL := 5 (Mode register number)
out dx,ax ; Set up mode
mov di,[USHORT _pagesize] ; ES:DI := offset into destination buffer
mov ax,[USHORT _pagesize+2]
add di,cx
adc al,0
call setBank ; Set the read/write bank number
xor si,si ; DS:SI := offset into source buffer
xor ax,ax
call setReadBank ; Set the read bank number
mov ax,0A000h
mov ds,ax ; DS:SI -> source buffer
mov es,ax ; ES:DI -> destination buffer
cld ; Moves go up in memory
rep movsb ; Move all data in bank FAST!
; Restore default graphics controller state
mov dx,3CEh ; DX := Graphics Controller address port
mov ax,0005h ; default mode register value
out dx,ax
pop ds
leave_c
ret
procend __copyTest16
;----------------------------------------------------------------------------
; void _copyTest256(void)
;----------------------------------------------------------------------------
; Routine to copy the top half of video memory to the bottom half of
; video memory, to test moving data across bank boundaries using separate
; read/write banks. To simplify the coding we move the first 100 scan
; lines down to start at scanline 205. This ensure allows us to move data
; from bank 0 to bank 2 in 640x??? display modes.
;----------------------------------------------------------------------------
procstart __copyTest256
enter_c 0
push ds ; Save registers
mov ax,100
mul [_bytesperline]
mov cx,ax ; CX := Number of bytes to move
shr cx,1 ; CX := Number of USHORTs to move
mov ax,205
mul [_bytesperline]
mov di,ax ; DI := offset into destination bank
mov al,dl
call setBank ; Set the read/write bank number
xor si,si ; DS:SI := offset into source buffer
xor al,al
call setReadBank ; Set the read bank number
mov ax,0A000h
mov ds,ax ; DS:SI -> source buffer
mov es,ax ; ES:DI -> destination buffer
cld ; Moves go up in memory
rep movsw ; Move all data in bank FAST!
pop ds
leave_c
ret
procend __copyTest256
;----------------------------------------------------------------------------
; void bltImage(char *p,int numBanks,int lastBytes)
;----------------------------------------------------------------------------
; Blts and image from a memory bank to the display. This routine does
; a simple full screen Blt, and is intended to test the speed of performing
; such Blts in 32 bit protected mode for specific resolutions. This code
; will only work in 32 bit protected mode, as we need to work with _huge_
; memory blocks in a linear fashion (it will however work with the 320x200
; 256 color standard VGA mode in real mode).
;----------------------------------------------------------------------------
procstart _bltImage
ARG p:DPTR, numBanks:UINT, lastBytes:UINT
enter_c 0
use_ds
push es
mov ax,fs
mov es,ax
xor _di,_di ; ES:_DI -> start of video memory
_lds _si,[p] ; DS:_SI -> memory block to Blt
xor dl,dl ; DL := first bank number
mov dh,[BYTE numBanks] ; DH := number of full banks to fill
or dh,dh
jz @@DoPartial ; Only a single bank to handle
; Move all of the full 64k banks first
@@OuterLoop:
mov al,dl
call setBank
mov _cx,4000h ; Need to set 4000h DWORDS per bank
rep movsd
xor _di,_di
inc dl
dec dh
jnz @@OuterLoop
; Now fill the last partial bank
@@DoPartial:
mov al,dl
call setBank
mov _cx,[lastBytes]
shr _cx,2 ; _CX := number of DWORDs to set
rep movsd
pop es
unuse_ds
leave_c
ret
procend _bltImage
endcodeseg test
END